package redis

import (
	"context"
	"github.com/go-redis/redis/v8"
)

// 将给定的空间元素（纬度、经度、名字）添加到指定的键里面，返回新添加到键里面的空间元素数量， 不包括那些已经存在但是被更新的元素
func (h *Handler) GeoAdd(key string, geoLocations ...*redis.GeoLocation) (count int64, err error) {
	count, err = h.Client.GeoAdd(context.Background(), key, geoLocations...).Result()
	go h.Log("Geo-GeoAdd", []interface{}{key, geoLocations}, count, err)
	return
}

// 从键里面返回所有给定位置元素的位置（经度和纬度）,返回一个数组， 数组中的每个项都由两个元素组成，第一个是精度，第二个是纬度
func (h *Handler) GeoPos(key string, members ...string) (geoPos []*redis.GeoPos, err error) {
	geoPos, err = h.Client.GeoPos(context.Background(), key, members...).Result()
	go h.Log("Geo-GeoPos", []interface{}{key, members}, geoPos, err)
	return
}

// 返回两个给定位置之间的距离，如果两个位置之间的其中一个不存在， 那么命令返回空值
// unit 取值范围：m-米/km-千米/mi-英里/ft-英尺
func (h *Handler) GeoDist(key string, member1, member2 string, unit string) (dist float64, err error) {
	dist, err = h.Client.GeoDist(context.Background(), key, member1, member2, unit).Result()
	go h.Log("Geo-GeoDist", []interface{}{key, member1, member2, unit}, dist, err)
	return
}

// 以给定的经纬度为中心，查询在指定范围内的所有元素并返回
func (h *Handler) GeoRadius(key string, longitude, latitude float64, query *redis.GeoRadiusQuery) (result []redis.GeoLocation, err error) {
	result, err = h.Client.GeoRadius(context.Background(), key, longitude, latitude, query).Result()
	go h.Log("Geo-GeoRadius", []interface{}{key, longitude, latitude, query}, result, err)
	return
}

// 以指定元素为中点，找出在指定范围内的所有元素并返回
func (h *Handler) GeoRadiusByMember(key, member string, query *redis.GeoRadiusQuery) (result []redis.GeoLocation, err error) {
	result, err = h.Client.GeoRadiusByMember(context.Background(), key, member, query).Result()
	go h.Log("Geo-GeoRadiusByMember", []interface{}{key, member, query}, result, err)
	return
}

// 以给定的经纬度为中心，查询在指定范围内的所有元素，存储在指定的键值中，且返回元素数量
// GeoRadiusQuery 结构中，Store 和 StoreDist 必填其一
func (h *Handler) GeoRadiusStore(key string, longitude, latitude float64, query *redis.GeoRadiusQuery) (count int64, err error) {
	count, err = h.Client.GeoRadiusStore(context.Background(), key, longitude, latitude, query).Result()
	go h.Log("Geo-GeoRadiusStore", []interface{}{key, longitude, latitude, query}, count, err)
	return
}

// 以指定元素为中点，找出在指定范围内的所有元素，存储在指定的键值中，且返回元素数量
// GeoRadiusQuery 结构中，Store 和 StoreDist 必填其一
func (h *Handler) GeoRadiusByMemberStore(key, member string, query *redis.GeoRadiusQuery) (count int64, err error) {
	count, err = h.Client.GeoRadiusByMemberStore(context.Background(), key, member, query).Result()
	go h.Log("Geo-GeoRadiusByMemberStore", []interface{}{key, member, query}, count, err)
	return
}

// 返回一个或多个位置元素的 Geohash 表示
func (h *Handler) GeoHash(key string, members ...string) (hashes []string, err error) {
	hashes, err = h.Client.GeoHash(context.Background(), key, members...).Result()
	go h.Log("Geo-GeoHash", []interface{}{key, members}, hashes, err)
	return
}
